perm filename GEN1[AI,JMC] blob sn#005441 filedate 1971-08-13 generic text, type T, neo UTF8
;COMMON CHESS ROUTINES
TITLE GEN

;GENERATE MOVES

GENMOV:	TRNN FL,TIMR
	JRST NTMGM
	AOS GMCTR
	MOVEI I,0
	CALLI I,31
	CONI 730,SVTGM#
NTMGM:	MOVE I,ULIM	;GET POINTER FOR STORING
	MOVE MOVER,COLOR	;GET COLOR (FIRST PIECE THIS SIDE)
	HRLI MOVER,-20		;20 PIECES
GMV1:	MOVE K,KIND(MOVER)	;FIND OUT WHAT KIND
	JRST @GENTB(K)	;GENERATE CORRECT MOVES
GENTB:	EXP GPN,GQRB,GKN,GQRB,GQRB,GKI

;MOVES FOR ROOKS, BISHOPS, QUEENS
GQRB:	MOVE K,LM(MOVER)	;START OF MOVES
	HLRE J,K	;NUMBER OF DIRECTIONS
	JRST PLG4	;MIDDLE OF LOOP (SEE PUTCH)
PLG2:	ADDI K,10	;NEXT DIRECTION
	ANDI K,-10	;START OF THOSE MOVES
PLG4:	SKIPGE T1,JMOVE(K)	;MOVE THERE?
	JRST PLG3	;NO, GET NEXT DIR
PLG1:	MOVE T2,T1	;HOLD ON TO MOVE
	ANDI T1,77	;THE DESTINATION
	SKIPGE T3,OCC(T1)	;ANYONE THERE?
	JRST .+5	;NO, NO WORRIES
	XOR T3,MOVER	;SEE IF SAME COLOR
	TRNN T3,20	;OFF IF SAME
	JRST PLG3-2	;NOT GOOD TO CAPTURE OWN PIECE
	TRO T2,CAPBT	;SET BIT FOR CAPTURE
	DPB MOVER,[POINT 5,T2,29]	;PUT IN MOVER
	MOVEM T2,(I)	;PUT THAT MOVE AWAY
	SUBI I,1	;DECREMENT POINTER
	SKIPL T1,JMOVE+1(K)	;NEXT MOVE THERE?
	AOJA K,PLG1	;YES, GO LOOK AT IT
PLG3:	AOJL J,PLG2	;LOOK AT MORE DIRS. IF ANY

;COMMON RETURN POINT OF MOVE GENERATORS

COMRG:	AOBJN MOVER,GMV1	;LOOK AT MORE PIECES
	PUSHJ P,KCAS	;NONE, CHECK TO SEE IF CASTLE
	JRST DOCS1	;NO, LOOK AT QUEEN SIDE
	MOVEI T1,KSCBT	;THE BIT FOR THAT MOVE
	MOVEM T1,(I)	;SET AS A MOVE
	SUBI I,1
DOCS1:	PUSHJ P,QCAS
	JRST DOCS2	;NOT HERE EITHER
	MOVEI T1,QSCBT
	MOVEM T1,(I)
	SUBI I,1
DOCS2:	MOVEM I,LLIM	;SAVE LOWER LIMIT
	MOVEM I,LLIM2#	;SAVE HERE FOR EXTRA LOOK-AHEAD
	TRNN FL,TIMR
	POPJ P,
	PUSH P,SVTGM
	PUSHJ P,TIMIT
	POP P,T1
	ADDM T1,TMGM
	POPJ P,

;MOVES FOR KNIGHTS

GKN:	MOVE K,LM(MOVER)	;THE MOVE TABLE POINTER
	HRLI K,-10		;ALWAYS 10 POSSIBLE
GKN2:	SKIPGE T1,JMOVE(K)	;A MOVE THERE?
	JRST GKN1	;NO, TRY NEXT
	MOVE T2,T1	;SAVE IT
	ANDI T1,77	;CHECK FOR SOMEONE THERE AS BEFORE
	SKIPGE T3,OCC(T1)
	JRST .+5
	XOR T3,MOVER
	TRNN T3,20
	JRST GKN1
	TRO T2,CAPBT
	DPB MOVER,[POINT 5,T2,29]
	MOVEM T2,(I)
	SUBI I,1
GKN1:	AOBJN K,GKN2	;MOVES ARE FIRST 10
	JRST COMRG	;NONE LEFT, RETURN TO COMMON PT.

;MOVES OF A KING.  DO NOT WORRY ABOUT CHECK

GKI:	MOVE K,LM(MOVER)
	SKIPGE T1,JMOVE(K)	;LOOK FOR MOVES
	JRST GMVK1	;WILL CHECK NEXT DIRECTION
	HRRZ T2,T1
	ANDI T1,77	;CHECK FOR PIECE AT DEST AND COLOR
	SKIPGE T3,OCC(T1)
	JRST .+5
	XOR T3,MOVER
	TRNN T3,20
	JRST GMVK1
	TRO T2,CAPBT
	DPB MOVER,[POINT 5,T2,29]
	MOVEM T2,(I)
	SUBI I,1
GMVK1:	ADDI K,7	;ONLY FIRST MOVE IN EACH DIR TO CONSIDER
	AOBJN K,GKI+1
	JRST COMRG

;PAWNS ARE A REAL MESS. DO THEM HERE

GPN:	HRRZ K,LM(MOVER)	;GET POINTER
	SKIPGE T1,JMOVE(K)	;GET MOVE
	JRST GMVP2	;TRY SECOND POSSIBLE
	HRRZ T2,T1	;SAVE
	ANDI T1,77	;CHECK DEST
	SKIPGE T3,OCC(T1)	;SOMEONE THERE (THIS MOVE A DIAG)
	JRST GMVP1P	;NO, SO NOT GOOD UNLESS ENPAS
	XOR T3,MOVER	;CHECK COLOR
	TRNN T3,20
	JRST GMVP2	;WORNG (CAN'T BE ENPAS)
	TRO T2,CAPBT
	MOVE T3,RANK(T1)	;CAHCK FOR PROMOTION
	CAIE T3,0	;BLACK NEVER ON 10 WHITE NEVER ON 0
	CAIN T3,7	;SO DON'T WORRY ABOUT COLOR
	PUSHJ P,PROMP	;YES GEN MOVES FOR ALL PPS PROMS
	DPB MOVER,[POINT 5,T2,29]
	MOVEM T2,(I)	;SAVE
	SUBI I,1
	JRST GMVP2	;NOW FOR SECOND
GMVP1P:	CAME T1,ENPSQ	;ONLY ON EP POSS AT A TIME, CHECK IT
	JRST GMVP2	;NO, TRY NEXT MOVE
	MOVE T3,EPMOVER	;WHO IS HE
	XOR T3,MOVER
	TRNN T3,20
	JRST GMVP2	;DON'T CAPTURE OWN PIECE
	TRO T2,CAPBT+EPCAP	;SET BITS
	DPB MOVER,[POINT 5,T2,29]
	MOVEM T2,(I)	;NO CHANCE OF PROMOTION
	SUBI I,1
GMVP2:	SKIPGE T1,JMOVE+1(K)	;SECOND MOVE
	JRST GMVP3	;NO,TRY THIRD
	HRRZ T2,T1	;SAVE
	ANDI T1,77
	SKIPGE T3,OCC(T1)
	JRST GMVP2P
	XOR T3,MOVER
	TRNN T3,20
	JRST GMVP3
	TRO T2,CAPBT
	MOVE T3,RANK(T1)
	CAIE T3,0
	CAIN T3,7
	PUSHJ P,PROMP
	DPB MOVER,[POINT 5,T2,29]
	MOVEM T2,(I)
	SUBI I,1
	JRST GMVP3	;NOW WASN'T THAT FUN
GMVP2P:	CAME T1,ENPSQ	;THIS IS ALSO FAMILIAR
	JRST GMVP3
	MOVE T3,EPMOVER
	XOR T3,MOVER
	TRNN T3,20
	JRST GMVP3
	TRO T2,CAPBT+EPCAP
	DPB MOVER,[POINT 5,T2,29]
	MOVEM T2,(I)
	SUBI I,1

GMVP3:	SKIPGE T1,JMOVE+2(K)	;MOVE NO. 3
	JRST COMRG	;IF NO #3 THE 4 IMPOSSIBLE TOO
	TRZ T1,777700	;REMOVE EXCESS BITS
	HRRZ T2,T1	;SAVE IT
	TLNE T1,200000	;WILL HAVE BIT IN LEFT ON IF ONLY PSEUDO
	JRST COMRG	;COULDN'T BE A FOURTH MOVE
	MOVE T3,RANK(T1)	;CHECK FOR PORMOTION
	DPB MOVER,[POINT 5,T2,29]	;PUT IN MOVER BITS
	CAIE T3,0
	CAIN T3,7
	PUSHJ P,PROMP
	MOVEM T2,(I)
	SUBI I,1
	SKIPGE T1,JMOVE+3(K)	;NOW CHECK FOURTH
	JRST COMRG	;NONE THERE
	TRZ T1,777700	;REMOVE BITS
	HRRZ T2,T1	;SAVE IT
	TLNE T1,200000
	JRST COMRG
	TRO T2,EPSET	;SET BIT FOR ENPAS
	MOVE T1,JMOVE+2(K)	;GET THE PLACE WHERE EP PSSS.
	ANDI T1,77
	LSH T1,13	;MOVE TO CORRECT PLACE
	IOR T2,T1	;PUT IN THE MOVE WORD
	DPB MOVER,[POINT 5,T2,29]
	MOVEM T2,(I)	;AND PUT IT AWAY
	SUBI I,1
	JRST COMRG	;ALL DONE

;HERE IS WHERE WE GEN MOVES INVOLVING PROMOTIONS

PROMP:	TRO T2,PROMBT	;TURN ON THE BIT
	MOVEI T3,4	;COULD PROMOTE TO Q-B-N-R (4-3-2-1)
PR1:	DPB T3,[POINT 3,T2,22]
	DPB MOVER,[POINT 5,T2,29]	;PUT IN MOVER
	MOVEM T2,(I)	;PUT IT AWAY
	SUBI I,1
	CAIE T3,2	;ONE MORE TO GO ITS SPEC
	SOJA T3,PR1	;NEXT POSSIBILITY
	SUBI T3,1
	DPB T3,[POINT 3,T2,22]	;PUT IT IN
	POPJ P,		;WILL BE STORED AT RETURN PT

;HERE IS THE CHECKER TO SEE IF CASTELING IS POSS.

KCAS:	MOVE T1,COLOR	;KING-SIDE GET COLOR
	SKIPL LOC+7(T1)	;IS ROOK ON THE BOARD
	TRNE FL,20(T1)	;20 IS WHITE OK 40 IS BLACK OK
	POPJ P,	;NO RETURN
	SKIPE T1	;NOW FOR THE CORRECT SQUARES
	MOVEI T1,70	;FOR BLACK
	SKIPGE OCC+5(T1)	;CHECK CQUARES FOR OCC
	SKIPL OCC+6(T1)
	POPJ P,		;CAN'T CASTLE IF OCC
	IORI T1,4	;CHECK FOR CHECK OR MOVE THRU CHECK
	HRLI T1,-20	;20 DIRECTIONS
KSCK1:	SKIPGE T2,JBEAR(T1)	;A BEARING
	JRST OKBK1	;NO
	TLNE T2,200000	;MAYBE ONLY PSEUDO
	JRST OKBK1
	XOR T2,COLOR	;CHECK SAMENESS OF COLOR
	TRNE T2,20
	POPJ P,		;DIFFERENT, SO NO CASTLE
OKBK1:	SKIPGE T2,JBEAR+1(T1)	;NOW FOR NEXT SQ
	JRST OKBK2
	TLNE T2,300000
	JRST OKBK2
	XOR T2,COLOR
	TRNE T2,20
	POPJ P,
OKBK2:	SKIPGE T2,JBEAR+2(T1)
	JRST OKBK3
	TLNE T2,300000
	JRST OKBK3
	XOR T2,COLOR
	TRNE T2,20
	POPJ P,
OKBK3:	ADDI T1,77	;NEXT DIRECTION
	AOBJN T1,KSCK1
	AOS (P)		;CASTLE OK, RETURN .+1
	POPJ P,

;HERE IS THE SAME THING FOR QUEEN SIDE

QCAS:	MOVE T1,COLOR
	SKIPL LOC(T1)	;IS ROOK THERE?
	TLNE FL,20(T1)	;BUT FLAG BITS IN LEFT HALF
	POPJ P,
	SKIPE T1
	MOVEI T1,70
	SKIPGE OCC+1(T1)	;AND DIFFERENT SQUARES TO CHECK
	SKIPL OCC+2(T1)
	POPJ P,
	SKIPL OCC+3(T1)	;AND ONE MORE TO CHECK
	POPJ P,
	IORI T1,1	;AND DIFFERENT HERE TOO
	HRLI T1,-20
QSCK1:	SKIPGE T2,JBEAR+1(T1)
	JRST OKBQ1
	TLNE T2,300000
	JRST OKBQ1
	XOR T2,COLOR
	TRNE T2,20
	POPJ P,
OKBQ1:	SKIPGE T2,JBEAR+2(T1)
	JRST OKBQ2
	TLNE T2,300000
	JRST OKBQ2
	XOR T2,COLOR
	TRNE T2,20
	POPJ P,
OKBQ2:	SKIPGE T2,JBEAR+3(T1)
	JRST OKBQ3
	TLNE T2,200000
	JRST OKBQ3
	XOR T2,COLOR
	TRNE T2,20
	POPJ P,
OKBQ3:	ADDI T1,77
	AOBJN T1,KSCK1
	AOS (P)
	POPJ P,

;HERE IS THE ROUTINE TO MAKE A MOVE. THE MOVE IS IN MOVER AND
;HAS THE FOLLOWING FORM
;BITS 30-35  DESTINATION OF MOVING PIECE
;BITS 25-29  MOVING PIECE
;BIT 24 IS ON IF MOVE IS A CAPTURE
;BIT 23 IS ON IF MOVE IS AN ENPASSENT CAPTURE
;BIT 18 IS ON IF THIS MOVE GENERATES A POSSIBILITY FOR
;	AN EP CAPTURE
;	IF SO BITS 19-24 GIVE THE LOCATION TO WHICH A PAWN
;	MUST MOVE TO MAKE TAHT CAPTURE
;BIT 19 IS ON TO INDICATE A PROMOTION TO BE MADE
;	BITS 20-22 GIVE THE KIND TO PROMOTE TO
;BIT 21 IS ON FOR QUEEN SIDE CASTLE
;BIT 22 IS ON FOR KING SIDE CASTLE
;THIS ROUTINE IS CALLED WITH A JSR AND SAVES INFORMATION IN THE
;STACK

GOMOV:	0
	PUSH P,FL	;SAVE FLAGS WITH IMPORTANT INFORMATION
	TRZ FL,CAPHP+PROMDN	;ERASE FLAGS SO NO FOWL UP
	MOVEM MOVER,SVMOV#	;SAVE THE MOVE
	PUSH P,EPMOVER#	;THE PAWN WHICH MAY BE CAPTURED EP
	PUSH P,ENPSQ#	;THE SQUARE ON WHICH IT'S GHOST LIES
	TRNE MOVER,EPSET	;SHOULD WE SET EP INFO
	JRST EPS
	SETOM EPMOVER	;NO, SET EP NOT POSSIBLE
	SETOM ENPSQ
	TRNE MOVER,EPCAP	;IS IT AN EP CAPTURE
	JRST CAPTEP
	TRNE MOVER,PROMBT	;IS IT A PROMOTION
	JRST NOCAST	;THE DO NOT LOOK FOR CASTLE BITS
	TRNE MOVER,QSCBT	;QUEEN SIDE
	JRST QSCS
	TRNE MOVER,KSCBT
	JRST KSCS
NOCAST:	TRNN MOVER,CAPBT	;A CAPTURE?
	JRST NOCAP
	TRO FL,CAPHP	;LEAVE TRACKS SO IT CAN BE UNDONE
	ANDI MOVER,77	;WHERE ARE WE GOING?
	PUSH P,MOVER	;MOVE SOMEONE OFF BOARD FROM HERE- SAVE
	MOVE MOVER,OCC(MOVER)	;WHO GOES AWAY?
	PUSH P,MOVER	;SO WE CAN GET HIM BACK

SCAP:	MOVNI DEST,1	;TO OFF BOARD
	PUSHJ P,PUTCH
NOCAP:	LDB MOVER,[POINT 5,SVMOV,29]	;GET THE MOVING PIECE
	PUSH P,LOC(MOVER)	;SAVE THE SQUARE HE WAS ON
	PUSH P,MOVER	;AND WHO HE WAS
	LDB DEST,[POINT 6,SVMOV,35]	;WHERE IS HE GOING
	PUSHJ P,PUTCH
	MOVE MOVER,SVMOV	;NOW SEE IF HE GITS A PROMOTION
	TRNE MOVER,PROMBT
	JRST DPROM
	PUSH P,FL	;SAVE THE NEW FLAGS WITH GOOD BITS
	JRST @GOMOV	;AND RETURN

;NOW ALL THE SPECIAL PIECES OF CODE

;SET ENPAS
EPS:	TRZ MOVER,PROMBT	;TO AVOID CONFUSION
	LDB DEST,[POINT 6,SVMOV,24]	;THE SQUARE FOR GHOST
	MOVEM MOVER,SVMOV	;PUT IT WHERE IT WILL BE SEEN
	MOVEM DEST,ENPSQ
	LDB MOVER,[POINT 5,SVMOV,29]	;AND WHO IT WAS
	MOVEM MOVER,EPMOVER
	JRST NOCAP+1	;CAN NOT BE A CAPTURE

;EP CAPTURE
CAPTEP:	MOVE MOVER,-1(P)	;THE OLD EPMOVER
	PUSH P,LOC(MOVER)	;WHERE HE WAS
	PUSH P,MOVER	;AND WHO HE WAS
	TRO FL,CAPHP	;JUST PRETEND ITS ANY OTHER CAPTURE
	JRST SCAP


;CASTELING

KSCS:	MOVEI MOVER,4	;KING MOVES
	IOR MOVER,COLOR	;THIS ONE
	PUSH P,LOC(MOVER)	;WILL SET UP TAKE BACK LIKE A CAPTURE
	PUSH P,MOVER
	MOVEI DEST,6	;SET UP DEST
	SKIPE COLOR
	MOVEI DEST,76	;FOR BLACK
	PUSHJ P,PUTCH
	MOVEI MOVER,7	;SIMILAR FOR ROOK
	IOR MOVER,COLOR
	PUSH P,LOC(MOVER)
	PUSH P,MOVER
	MOVEI DEST,5
	SKIPE COLOR
	MOVEI DEST,75
COMCS:	PUSHJ P,PUTCH
	TRO FL,CAPHP	;PRETEND IT WAS JUST A CAPTURE
	PUSH P,FL	;SAVE FLAGS
	JRST @GOMOV	;AND RETURN
QSCS:	MOVEI MOVER,4	;QUEEN SIDE IS SIMILAR
	IOR MOVER,COLOR
	PUSH P,LOC(MOVER)
	PUSH P,MOVER
	MOVEI DEST,2
	SKIPE COLOR
	MOVEI DEST,72
	PUSHJ P,PUTCH
	MOVE MOVER,COLOR
	PUSH P,LOC(MOVER)
	PUSH P,MOVER
	MOVEI DEST,3
	SKIPE COLOR
	MOVEI DEST,73
	JRST COMCS	;THE COMMON PART

;PROMOTIONS ARE FUN BECAUSE OF THE TABLE TO BE ADJUSTED

DPROM:	TRO FL,PROMDN	;LET THE TAKE BACK ROUTINE KNOW
	LDB MOVER,[POINT 5,SVMOV,29]	;WHO IS IT?
	PUSH P,LM(MOVER)	;ONE ENTRY WHICH GETS CHANGED
	MOVE T2,PCTB(MOVER)	;THE DISPLAY NEED CHANGING
	PUSH P,1(T2)	;SAVE THE OLD CHARACTER WORDS
	PUSH P,2(T2)
	MOVNI DEST,1	;MOVE HIM OFF THE BACK ON
	PUSH P,T2	;SAVE THIS
	PUSHJ P,PUTCH
	POP P,T2	;BUT ONLY FOR A LITTLE WHILE
	LDB DEST,[POINT 3,SVMOV,22]	;WHAT KIND IS IT NOW
	MOVEM DEST,KIND(MOVER)	;WAS PAWN NO NEED TO SAVE
	IOR DEST,COLOR		;NEED DISPLAY CHARACTER
	MOVE DEST,PCTB-1(DEST)	;GET IT HERE
	MOVE T1,1(DEST)
	MOVEM T1,1(T2)	;AND PUT IT DOWN
	MOVE T1,2(DEST)
	MOVEM T1,2(T2)
	MOVE DEST,KIND(MOVER)	;WHAT WAS THAT AGAIN?
	MOVNI T1,10
	CAIN DEST,2	;UNLESS KNIGHT PUT -10 IN LEFT OF LM
	MOVEI T1,7	;ELSE 7
	HRLM T1,LM(MOVER)
	LDB DEST,[POINT 6,SVMOV,35]	;WHERE HE WAS
	PUSHJ P,PUTCH	;PUT BACK ON WITH RIGHT BEARINGS ETC
	PUSH P,FL
	JRST @GOMOV

;NOW TO RETRACT A MOVE

;ALSO CALLED WITH A JSR. GETS ALL INFO FROM STACK

UNMOV:	0
	POP P,FL	;THESE FLAGS HAVE INFO ON KIND OF MOVE
	TRZN FL,PROMDN	;WAS THERE A PROMOTION
	JRST NOPROU	;NO
	MOVE MOVER,-3(P)	;WHO WAS HE?
	MOVE DEST,PCTB(MOVER)	;THE DISPLAY WORDS
	POP P,2(DEST)	;RESTORE OLD ONES
	POP P,1(DEST)
	MOVNI DEST,1	;NOW GET HIM OFF BOARD
	PUSHJ P,PUTCH	;(ELSE BEARINGS GET CONFUSED
	POP P,LM(MOVER)	;RESTORE THIS
	SETZM KIND(MOVER)	;WAS A PAWN
NOPROU:	POP P,MOVER	;GET WHO
	POP P,DEST	;AND WHERE FROM
	PUSHJ P,PUTCH	;PUT HIM BACK
	TRZN FL,CAPHP	;CAPTURE
	JRST NOCAPU	;NO, ALMOST DONE
	POP P,MOVER	;PUT CAPTURED PIECE BACK
	POP P,DEST
	PUSHJ P,PUTCH
NOCAPU:	POP P,ENPSQ	;RESTORE MISC. INFO
	POP P,EPMOVER
	POP P,FL	;THESE FLAGS ALSO HAVE CASTLEING BITS
	JRST @UNMOV	;RETURN


;NO FOR A LITTLE PROGRAM TO DO ALPHA BETA

MKMOV:	AOS LEVEL#	;LEVEL INCREASES BY ONE
	MOVEI T3,0	;ZERO THIS LEVEL OF PRINCIPAL VARIATION
	IDPB T3,STWD
	MOVE T3,STWD	;SET START OF PVAR POINTER
	MOVEM T3,STWDP#
	TRZ FL,INCKFF
	HRLZI T1,500000
	MOVEM T1,VALUE#
	MOVE T1,ALPHA
	TRNN FL,FGMF
	JRST NF1
	PUSHJ P,CKCK
	JRST NF1A
	MOVE T1,WCOUNT
	SUB T1,BCOUNT
	SKIPE COLOR
	MOVNS T1
	LSH T1,1
	CAML T1,BETA
	POPJ P,
	CAMLE T1,ALPHA
	MOVEM T1,ALPHA
	SKIPA
NF1A:	TROA FL,INCKFF
NF1:	MOVEM T1,VALUE
	PUSHJ P,GENMOV	;GENERATE POSSIBLE MOVES
	PUSHJ P,ORDMV	;ORDER THEM BY PLAUSIBILITY
	MOVE I,ULIM
	TRNN FL,INCKFF
	CAME I,LLIM2
	JRST NOSTL
	MOVEI T1,0
	POPJ P,
NOSTL:	TLNN FL,WP2M	;FULL WALLPAPER MODE?
	JRST WP2A
	TRO FL,PRWP
	MOVE I,ULIM
	CAMG I,LLIM
	JRST EVPRT
WALPF1:	CAMG I,LLIM
	JRST WP2
	MOVE MOVER,LEVEL
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	SOJG MOVER,.-2
	MOVE T1,LEVEL
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	HLRE T1,(I)
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	HRRZ MOVER,(I)
	PUSHJ P,PRNTMV
	SOJA I,WALPF1
EVPRT:	MOVEI T2,[ASCIZ /
EVALUATE
/]
	PUSHJ P,TXTOU1
WP2:	MOVE T1,ALPHA
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	MOVE T1,BETA
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ /
/]
	PUSHJ P,TXTOU1
WP2A:	TRZ FL,PRWP
	MOVE I,ULIM#	;GET SET TO EXAMINE
	CAMG I,LLIM
	JRST EVALIT	;EVALUATE IF NO MOVES FROM ORDERER
	MOVE T3,LEVEL
	CAML T3,MAXLV
	JRST KISOFF
	MOVE MOVER,(I)	;GET FIRST MOVE
	DPB MOVER,STWD	;AND PUT IT IN THE PRINCIPLE VARIATION
LP:	SKIPE QFLG	;SHOULD WE QUIT
	POPJ P,	;YES

EXTERNAL QFLG,WCOUNT,BCOUNT

	MOVE T3,LEVEL	;POSITION LEVEL POINTER
	IDIVI T3,12
	MOVE T3,SDBTBL(T3)
	MOVEM T3,LVPLC
	MOVE T4,SDBTB2(T4)
	MOVEM T4,LVPLC2
	CAMG I,LLIM#	;OUT OF MOVES YET?
	JRST VALCK	;RETURN PRESENT VALUE IF NOT MINUS INFINITY
LOOKON:	MOVE MOVER,(I)	;GET THE MOVE
	TLNN FL,TRCMD	;IS THIS TRACE MODE?
	JRST NOTRC1
	MOVE T1,LEVEL
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	PUSHJ P,PRNTMV	;PRINT CURRENT MOVE
	PUSHJ P,INWD	;GET SOME INPUT
	CAIN T2,175	;IS IT ALTMODE?
	JRST NOTRC1	;YES, CONTINUE
	TLO FL,TRCPV	;NO, DO NOT TRACE LOWER
	PUSH P,FL	;SAVE FLAGS
	TLZA FL,TRCMD+TRCPV
NOTRC1:	PUSH P,FL
	SKIPE COLOR	;ONE EFFORT COUNT FOR BLACK AND ONE FOR WHITE
	AOSA BEFFT#
	AOS WEFFT#
	PUSH P,I	;SAVE I
	JSR GOMOV	;MAKE THE MOVE
;TIME OUT TO DEFINE A MACRO

DEFINE SAVE (A)
<IRP A <PUSH P,A>>

	PUSH P,COLOR
	MOVEI T1,20
	XORM T1,COLOR
	TRNN FL,INCKFF
	TRNN FL,FGMF
	JRST NONF
	PUSHJ P,CKCK
	JRST NONF
	PUSHJ P,EVALIT	;GET VALUE
	MOVE T2,WCOUNT	;COMPUT PIECE COUNT
	SUB T2,BCOUNT
	SKIPN COLOR
	MOVNS T2
	LSH T2,1
	CAMG T2,ALPHA	;COMPARE WITH ALPHA
	JRST NOGO	;DO NOT TAKE UNLESS BRINGS LEVEL ABOVE ALPHA
NONF:	SAVE <ULIM,LLIM,LLIM2,LEVEL,ALPHA#,BETA#,CKLEV#,STWD,STWDP,VALUE>
	MOVE T1,LLIM2	;GET SET TO DO ANOTHER LEVEL
	MOVEM T1,ULIM	;RESET MOVE GENERATING SPACE
	MOVN T1,ALPHA	;INTERCHANGE AND INVERT ALPHA AND BETA
	EXCH T1,BETA
	MOVNM T1,ALPHA
	TRNN FL,FGMF	;IS IT FORCED GAME?
	JRST .+3	;NO, FORGET IT
	PUSHJ P,CKCK	;IN CHECK?
	SOS CKLEV	;YES, DECREASE LEVEL
	PUSHJ P,MKMOV	;NOW DO ANOTHER LEVEL
;ANOTHER MACRO

DEFINE UNSAVE (A)
<IRP A <POP P,A>>

	UNSAVE <VALUE,STWDP,STWD,CKLEV,BETA,ALPHA,LEVEL,LLIM2,LLIM,ULIM,COLOR#>
NOGO1:	JSR UNMOV	;RETRACT MOVE
	POP P,I
	POP P,FL	;RESTORE FLAGS AS SET BY TRACE
	SKIPE QFLG
	POPJ P,
	MOVE T3,ALPHA	;DISPLAY ALPHA AND BETA
	SKIPE COLOR
	MOVNS T3	;GET CORRECTED FOR WHO'S ON FIRST
	MOVEI T4,ADP
	SKIPE COLOR
	MOVEI T4,BDP
	PUSHJ P,DNUM	;DISPLAY
	MOVE T3,BETA
	SKIPE COLOR
	MOVNS T3
	MOVEI T4,BDP
	SKIPE COLOR
	MOVEI T4,ADP
	PUSHJ P,DNUM
	MOVNS T1	;SINCE IT WAS EVALUATED FOR OTHER PLAYER, INVERT
	TLZN FL,TRCPV	;SHOULD WE DO A PRINT
	SKIPN T2,LEVEL
	PUSHJ P,WALLP
	TLNN FL,WP2M	;IF FULL WALLPAPER MODE
	JRST WP2P
	TRO FL,PRWP
	PUSH P,T1
	MOVE MOVER,LEVEL
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	SOJG MOVER,.-2
	MOVE T1,LEVEL
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / A=/]
	PUSHJ P,TXTOU1
	MOVE T1,ALPHA
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / B=/]
	PUSHJ P,TXTOU1
	MOVE T1,BETA
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / V=/]
	PUSHJ P,TXTOU1
	MOVE T1,(P)
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	HRRZ MOVER,(I)
	PUSHJ P,PRNTMV
	POP P,T1
	TRZ FL,PRWP
WP2P:	CAML T1,BETA	;IS IT TOO GOOD?
	JRST RTBTA	;YES, RETURN BETA
	CAMLE T1,VALUE
	MOVEM T1,VALUE
	CAML T1,ALPHA
	TRZ FL,INCKFF
	CAMG T1,ALPHA	;TOO POOR?
	JRST ADVSTW	;YES, IGNORE BUT ADVANCE STWD
	MOVEM T1,VALUE
	MOVEM T1,ALPHA	;YES IT IS GOOD
	MOVE T2,(I)	;RETRIEVE MOVE
	MOVE T3,STWDP
	DPB T2,T3	;MOVE UP THE PRINCIPLE VARIATION
SP1:	ILDB T2,STWD
	IDPB T2,T3
	JUMPN T2,SP1
	MOVEM T3,STWD
	CAME T1,BETA	;IS BETA SAME AS ALPHA?
	SOJA I,LP	;NO, GO LOOK AT MORE
	POPJ P,	;YES, RETURN NOW WITH THAT VALUE
RTBTA:	MOVE T2,(I)
	MOVE T3,STWDP	;SAME AS ABOVE
	DPB T2,T3
SP2:	ILDB T2,STWD
	IDPB T2,T3
	JUMPN T2,SP2
	MOVEM T3,STWD
	POPJ P,
RTVAL:	MOVE T1,VALUE	;RETURN A VALUE
	POPJ P,
VALCK:	CAMG I,LLIM2	;ARE THERE ANY LEFT
	JRST RTVAL	;NO, MUST GIVE VALUE
	HLRE T1,(I)	;DOES IT GET INTO CHECK?
	JUMPL T1,RTVAL	;YES, ALL GONE
	MOVE T1,ALPHA	;CHECK CURRENT VALUE
	CAME T1,[XWD 600000,0]	;IS IT MINUS INFINITY
	JRST RTVAL	;NO, RETURN IT
	JRST LOOKON	;YES, CONTINUE LOOKING
ADVSTW:	MOVE T2,STWDP	;GET MAIN POSITION
	MOVEM T2,STWD	;AND PUT HERE
	ILDB T2,STWD	;LOOK FOR THE ZERO WORD
	JUMPN T2,.-1
	SOJA I,LP	;GO DO NEXT MOVE
NOGO:	POP P,COLOR
	MOVE T3,STWD
	SETZM 1(T3)
	JRST NOGO1

KISOFF:	HRLZI T1,540000
	POPJ P,

MAXLV:	100

INTERNAL MAXLV
;ROUTINE TO GET A CHARACTER FROM TTY
;CHARACTER IS RETURNED IN T2. CALLED BY PUSHJ.

GNCH:	SOSG IBUF+2	;CHECK FOR MORE
	INPUT 2,0	;TTY IS DEVICE 2
	ILDB T2,IBUF+1	;GET CHARACTER
	JUMPE T2,GNCH	;IGNORE NULLS
	POPJ P,		;RETURN

;THIS ROUTINE READS IN AN IDENTIFIER
;CALLED BY PUSHJ RETURN IDENT IN INBFH (ARRAY) ALSO FIRST
;WORD (ASCII) IN T1 AND TERMINATING CHAR IN T2. IF TERMINATOR
;IS FIRST THING SEEN RETURN IT IN T1 AND T2 AND INBFH.

INWD:	SETZM INBFH
	MOVE T1,[XWD INBFH,INBFH+1]	;CLEAR IT OUT
	BLT T1,INBFH+22
	MOVE T1,[POINT 7,INBFH]
	PUSHJ P,GNCH
	CAIG T2,40
	JRST .-2	;SKIP BLANKS TABS ETC
INWD1:	CAIL T2,"0"	;A NUMBER?
	CAILE T2,"9"
	JRST SPCL1	;NO CHECK FOR LETTER
INWD2:	IDPB T2,T1	;LETTER OR NUMBER
	PUSHJ P,GNCH	;GET NEXT
	JRST INWD1
SPCL1:	CAIL T2,"A"	;A LETTER?
	CAILE T2,"Z"
	SKIPA	;NO, SPECIAL CHARACTER SO TERMINATE
	JRST INWD2	;YES, PACK IT
	SKIPN INBFH	;ANY IDENTIFIER SEEN
	IDPB T2,T1	;NO, MAKE IT TERMINATOR
	MOVE T1,INBFH	;RETURN FIRST 5 CHARS
	POPJ P,

;GET A NUMBER (OCTAL) CALLED BY PUSHJ
;RETURNS NUMBER IN T1

NUMIN:	MOVEI T1,0
	SETZM NEGNUM#
	PUSHJ P,GNCH	;GET A CHR
	CAIG T2,40	;IGNORE THESE RANDOM CHARACTERS
	JRST .-2
	CAIE T2,"-"
	JRST NIN1
	SETOM NEGNUM
	PUSHJ P,GNCH
NIN1:	CAIL T2,"0"	;NUMBER?
	CAILE T2,"7"
	JRST NIN2
	LSH T1,3	;PUT IT INTO NUMBER
	IORI T1,-"0"(T2)
	PUSHJ P,GNCH
	JRST NIN1	;CONTINUE
NIN2:	SKIPE NEGNUM
	MOVNS T1
	POPJ P,

;ROUTINE TO PRINT NAME OF PIECE. CALLED BY PUSHJ WITH
;PIECE NUMBER IN T1

PCPRT:	MOVEI T2,[ASCIZ /B/]
	TRNN T1,20
	MOVEI T2,[ASCIZ /W/]	;DECIEDE ON COLOR
	TRNE FL,PRWP	;IF IN WALLP MODE
	PUSHJ P,TXTOUT	;WRITE IT HERE
	CALLI T2,3	;USE DDT OUTPUT
	MOVE T2,KIND(T1)	;GET KIND
	MOVE T2,ASCP(T2)	;GET THE ASCII FOR THAT KIND
	TRNE FL,PRWP
	PUSHJ P,TXTOUT
	CALLI T2,3
	POPJ P,

;A MACRO TO MAKE PUTTING IN ASCII EASIER
DEFINE ASKR (A)
	<IRP A <EXP [ASCII /A/]>>

ASCP:	ASKR <P,R,N,B,Q,K>

;PRINT THE NAME OF A LOCATION
;CALLED BY PUSHJ WITH SQ NUMBER IN T1

LCPRT:	MOVE T2,FILE(T1)	;PRINT NAME OF THAT FILE
	MOVE T2,FLNM(T2)
	TRNE FL,PRWP
	PUSHJ P,TXTOUT
	CALLI T2,3
	MOVE T3,RANK(T1)	;NOW THE RANK
	SKIPG COLOR	;LOOKING AT FORM WHICH SIDE?
	JRST .+3
	SUBI T3,7
	MOVNS T3
	ADDI T3,"1"	;MAKE IT ASCII
	LSH T3,↑D29	;LEFT JUSTIFIED
	MOVEM T3,TMP#
	MOVEI T2,TMP	;FOR DDT OUT
	TRNE FL,PRWP
	PUSHJ P,TXTOUT
	CALLI T2,3
	POPJ P,
FLNM:	ASKR <QR,QN,QB,Q,K,KB,KN,KR>

;PRINT OUT A MOVE CALLED WITH MOVE IN MOVER

PRNTMV:	PUSHJ P,PRNTM1
	MOVEI T2,[ASCIZ /
/]
	TRNE FL,PRWP
	PUSHJ P,TXTOUT
	CALLI T2,3
	POPJ P,
PRNTM1:	TRNN MOVER,EPSET	;IF SO NO CAST POSSIB
	TRNE MOVER,PROMBT	;IF A PROMOTION DO NOT CHECK CASTELING
	JRST NOCASP
	TRNE MOVER,QSCBT	;CASTLEING IS SPECIAL
	JRST QCSPT
	TRNE MOVER,KSCBT
	JRST KCSPT
NOCASP:	LDB T1,[POINT 5,MOVER,29]	;GET MOVER
	PUSHJ P,PCPRT	;PRINT IT
	MOVEI T2,[ASCIZ ./.]	;AND A /
	TRNE FL,PRWP
	PUSHJ P,TXTOUT
	CALLI T2,3
	MOVE T1,LOC(T1)	;NOW WHERE IT IS
	PUSHJ P,LCPRT
	TRNE MOVER,EPSET	;NO CAPT IF EPSET
	JRST NOCAPP
	TRNE MOVER,CAPBT	;IS IT A CAPTURE
	JRST CAPT

NOCAPP:	MOVEI T2,[ASCIZ /-/]
	TRNE FL,PRWP
	PUSHJ P,TXTOUT
	CALLI T2,3
DSTPT:	LDB T1,[POINT 6,MOVER,35]	;PRINT DESTINATION
	PUSHJ P,LCPRT
	TRNN MOVER,EPSET	;NO PROMOTION IF EPSET
	TRNN MOVER,PROMBT	;WORRY SOME MORE ABOUT PROMOTION
	POPJ P,		;NONE HERE
	MOVEI T2,[ASCIZ /=/]
	TRNE FL,PRWP
	PUSHJ P,TXTOUT
	CALLI T2,3	;PRINT OUT THE PROMOTION
	LDB T1,[POINT 3,MOVER,22]	;PROMOTE TO WHAT
	MOVE T2,ASCP(T1)	;NAME OF THAT
	TRNE FL,PRWP
	PUSHJ P,TXTOUT
	CALLI T2,3
	POPJ P,		;ALL DONE
CAPT:	MOVEI T2,[ASCIZ /*/]	;PRINT * FOR CAPTURE
	TRNE FL,PRWP
	PUSHJ P,TXTOUT
	CALLI T2,3
	TRNE MOVER,EPCAP	;ENPAS. IS EVEN WORSE
	JRST ITSEP
	LDB T1,[POINT 6,MOVER,35]	;WHO HE CAPTURE?
	MOVE T1,OCC(T1)
	PUSHJ P,PCPRT
	MOVEI T2,[ASCIZ ./.]	;AND THAT LOCATION
	TRNE FL,PRWP
	PUSHJ P,TXTOUT
	CALLI T2,3
	JRST DSTPT
ITSEP:	MOVE T1,EPMOVER	;THIS IS WHO HE CAPTURES
	PUSHJ P,PCPRT
	MOVEI T2,[ASCIZ ./.]
	TRNE FL,PRWP
	PUSHJ P,TXTOUT
	CALLI T2,3
	MOVE T1,LOC(T1)	;LOCATION OF THE SQUARE THAT PAWN IS ON
	JRST LCPRT	;CAN NOT BE PROMOTION
QCSPT:	MOVEI T2,[ASCIZ /O-O-O/]
	TRNE FL,PRWP
	PUSHJ P,TXTOUT
	CALLI T2,3	;THESE ARE EASY
	POPJ P,
KCSPT:	MOVEI T2,[ASCIZ /O-O/]
	TRNE FL,PRWP
	PUSHJ P,TXTOUT
	CALLI T2,3
	POPJ P,

;NOW A ROUTINE TO PRINT THE BOARD AL A GREENBLATT

PTBD:	MOVE DEST,[XWD -100,110]	;64 (DEC) SQRS
	MOVEI T3,10	;PUT ONLY 10 PER LINE
	TLZ FL,BSQBT	;BIT FOR ON BLACK SQUARE
PTBD1:	SKIPGE T1,OCC-20(DEST)	;ANYONE ON THIS SQUARE
	JRST NOOC	;NO, PRINT -- OR **
	PUSHJ P,PCPRT	;PRINT HIM
	MOVEI T2,[ASCIZ / /]
CPTBD:	TRNE FL,PRWP
	PUSHJ P,TXTOUT
	CALLI T2,3
	TLC FL,BSQBT	;ALTERNATE COLORS
	SOJG T3,CPTBD2	;OUT OF SQUARES ON THIS LINE?
	MOVEI T2,[ASCIZ /
/]	;GO TO NEXT LINE
	TRNE FL,PRWP
	PUSHJ P,TXTOUT
	CALLI T2,3
	TLC FL,BSQBT	;NEED TO INVERT ANOTHER TIME
	MOVEI T3,10	;SET UP FOR 10 MORE
	SUBI DEST,20
CPTBD2:	AOBJN DEST,PTBD1	;PRINT NEXT SQUARE
	MOVEI T2,[ASCIZ /
/]
	TRNE FL,PRWP
	PUSHJ P,TXTOUT
	CALLI T2,3
	POPJ P,
NOOC:	MOVEI T2,[ASCIZ /-- /]	;A WHITE SQUARE
	TLNN FL,BSQBT	;OR IS IT BLACK?
	MOVEI T2,[ASCIZ /** /]	;YES, IT IS
	JRST CPTBD

;A ROUTINE TO SEE IF THE MOVER IS IN CHECK

CKCK:	MOVE T1,COLOR
	IORI T1,4	;THE PROPER KING
	MOVE T1,LOC(T1)	;WHERE IS HE?
	HRLI T1,-20	;20 DIRECTIONS TO CHECK
CKC2:	SKIPGE T2,JBEAR(T1)	;A BEARING?
	JRST CKC1	;NO
	TLNE T2,240000	;IS IT ONLY A FAKE?
	JRST CKC1	;YES
	XOR T2,COLOR	;IS IT OUR OWN PIECE
	TRNE T2,20
	POPJ P,		;NO, IN CHECK RETURN
CKC1:	ADDI T1,77	;NEXT DIRECTION
	AOBJN T1,CKC2
	AOS (P)		;NOT IN CHECK, RETURN .+1
	POPJ P,

;HERE IS THE WALLPAPER MODE PRINTER
;FOR EACH MOVE AT THE TOP LEVEL THE MOVE IS PRINTED
;ALONG WITH THE PRINCIPLE VARIATION
;THE VALUE, PROPOSED VALUE, AND EFFORT (NUMBER OF
;POSITIONS EXAMINED) ARE ALSO PRINTED

WALLP:	TLNN FL,WPMD	;IS THIS WALLPAPER MODE?
	POPJ P,		;NO, RETURN
WALLP2:	TRO FL,PRWP	;SO ALL THINKS ARE PRINTED ON CORRECT
			;DEVICE
	SAVE <T1,I,COLOR,STWD>	;SAVE THESE
	SETZM SVT1#	;TO COUNT NUMBER OF MOVES TO RETRACT
	MOVE MOVER,(I)	;GET THIS MOVE
	PUSHJ P,PRNTMV
	MOVEI T1,20
	XORM T1,COLOR
	AOS SVT1
	JSR GOMOV
PRVT:	ILDB MOVER,STWD	;GET A MOVE
	JUMPE MOVER,EPV		;ZERO IS END OF PVAR
	PUSHJ P,PRNTMV	;GO PRINT IT
	AOS SVT1	;COUNT IT
	JSR GOMOV	;NOW MAKE IT SO CAN PRINT MORE
	MOVEI T1,20	;NEED TO CAHNGE COLOR
	XORM T1,COLOR
	JRST PRVT	;NEXT MOVE
EPV:	JSR UNMOV
	SOSE SVT1	;RETRIEVE
	JRST EPV
PEF:	UNSAVE <STWD,COLOR,I>	;NOW ALMOST BACK TO WHERE WE WERE
	MOVEI T2,[ASCIZ /V=/]
	PUSHJ P,TXTOU1
	MOVE T1,(P)	;VALUE OF THE MOVER
	PUSHJ P,NOUT	;PRINT IT
	MOVEI T2,[ASCIZ /	PV=/]
	PUSHJ P,TXTOU1
	HLRZ T1,(I)	;THE PROPOSED VALUE OF THIS MOVE
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ /	MEF=/]
	PUSHJ P,TXTOU1
	SKIPE COLOR	;PRINT EFFORT FOR MOVER
	SKIPA T1,BEFFT
	MOVE T1,WEFFT
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ /	OPEF=/]
	PUSHJ P,TXTOUT
	JFCL
	SKIPN COLOR	;NOW EFFOR FOR NON-MOVER
	SKIPA T1,BEFFT
	MOVE T1,WEFFT
	PUSHJ P,NOUT
	SETZM WEFFT
	SETZM BEFFT	;ZERO IT FOR NEXT MOVE
	MOVEI T2,[ASCIZ /	RUNT=/]
	PUSHJ P,TXTOU1
	MOVEI T1,0
	CALLI T1,27	;GET RUNTIME
	PUSH P,T1
	SUB T1,SVRUNT
	POP P,SVRUNT
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ /
/]
	PUSHJ P,TXTOUT	;PRINT IT
	JFCL		;SINCE IT RETURNS +1
	TRNN FL,TIMR
	JRST NOTMW
	MOVEI T2,[ASCIZ /PUTCH /]
	PUSHJ P,TXTOU1
	MOVE T1,TMPUT
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	MOVE T1,PTCTR
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	MOVE T1,TMPUT
	IDIV T1,PTCTR
	PUSHJ P,NOUT
	SETZM TMPUT
	MOVEI T2,[ASCIZ /	GMOV /]
	PUSHJ P,TXTOU1
	SETZM PTCTR
	MOVE T1,TMGM
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	MOVE T1,GMCTR
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	MOVE T1,TMGM
	IDIV T1,GMCTR
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ /
MPRO /]
	PUSHJ P,TXTOU1
	SETZM TMGM
	SETZM GMCTR
	MOVE T1,TMMP
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	MOVE T1,MPCTR
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	MOVE T1,TMMP
	IDIV T1,MPCTR
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ /	PUTM /]
	PUSHJ P,TXTOU1
	SETZM MPCTR
	MOVE T1,TMPMP
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	MOVE T1,MPPCTR
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	MOVE T1,TMPMP
	IDIV T1,MPPCTR
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	MOVE T1,TMPMP
	IMULI T1,↑D1000
	IDIV T1,TMMP
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ /
FIL /]
	PUSHJ P,TXTOU1
	SETZM MPPCTR
	SETZM TMPMP
	MOVE T1,FTMR
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	MOVE T1,FTMR
	IDIV T1,FCTR
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	MOVE T1,FTMR
	IMULI T1,↑D1000
	IDIV T1,TMMP
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ /  VUL /]
	PUSHJ P,TXTOU1
	MOVE T1,VTMR
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	MOVE T1,VTMR
	IDIV T1,VCTR
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	MOVE T1,VTMR
	IMULI T1,↑D1000
	IDIV T1,TMMP
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ /
VUL2 /]
	PUSHJ P,TXTOU1
	MOVE T1,V2TMR
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	MOVE T1,V2TMR
	IDIV T1,V2CTR
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ / /]
	PUSHJ P,TXTOU1
	MOVE T1,V2TMR
	IMULI T1,↑D1000
	IDIV T1,TMMP
	PUSHJ P,NOUT
	MOVEI T2,[ASCIZ /
/]
	PUSHJ P,TXTOU1
	SETZM FTMR
	SETZM V2CTR
	SETZM TMMP
	SETZM FCTR
	SETZM VCTR
	SETZM VTMR
	SETZM V2TMR
	SETZM VCTMR
NOTMW:	TRZ FL,PRWP	;GO BACK TO TTY OUTPUT
	OUTPUT 3,0	;BUT MAKE SURE IT ALL GOT OUT
	POP P,T1		;RESTORE THE VALUE
	POPJ P,
EXTERNAL GMCTR,MPCTR,MPPCTR,FTMR,VTMR,V2TMR,VCTMR,FCTR,VCTR,V2CTR,SVRUNT

;MISC. ROUTINES STARTING WITH A DECIMAL PRINT

NOUT:	JUMPGE T1,NOUT1A
	MOVEI T2,"-"
	PUSHJ P,OCHR
	MOVNS T1
NOUT1A:	CAML T1,[XWD 200000,0]
	JRST INFP	;SPECIAL INFINITY CHECK
NOUT1:	IDIV T1,RADIX
	ADDI T2,"0"
	HRLM T2,(P)
	SKIPE T1
	PUSHJ P,NOUT1
	HLRZ T2,(P)
	JRST OCHR	;THIS IS SO FAMOUS IT NEEDS NO COMMENT
EXTERNAL RADIX
INTERNAL NOUT,TXTOU1

INFP:	CAMG T1,[XWD 200000,0]
	JRST INF1
	MOVEI T2,[ASCIZ /2*/]
	PUSHJ P,TXTOU1
INF1:	MOVEI T2,[ASCIZ /INF/]
	JRST TXTOU1

;NOW THE VARIOUS OUTPUT ROUTINES

OCHR:	SOSG OBUF+2
	OUTPUT 3,0
	IDPB T2,OBUF+1
	POPJ P,

TXTOUT:	AOS(P)
TXTOU1:	TLO T2,440700
	MOVEM T2,SVT2#
TO1:	ILDB T2,SVT2
	JUMPE T2,RTXOUT	;ZERO IS END OF STRING USE ASCIZ
	PUSHJ P,OCHR
	JRST TO1
RTXOUT:	POPJ P,

;HERE IS THE GLORIOUS MOVE INPUT ROUTINE

DEFINE SETOMR (A)
<IRP A <SETOM A>>
INMOV:	SETOMR <FS1#,FS2#,FD1#,FD2#,RS#,RD#,K1#,K2#,PCI1#,PCI2#,PROKD#,SVN1#,SVN2#>
	TRZ FL,CAPIN+PROIN	;TURN OFF FLAGS FOR PRO OR CAP INPUT
	CAMN T1,[ASCIZ /O/]
	JRST CSTLIN
	HRLZI T3,-24	;24 PIECE NAMES
	CAMN T1,PCSYM(T3)	;IS IT THIS
	JRST FPCSYM	;YES FOUND IT
	AOBJN T3,.-2
	POPJ P,		;NOT FOUND, ERROR RETURN
FPCSYM:	MOVE T4,PCMN(T3)	;HAS LEFT KIND RIGHT PIECE OR -1
	HLRZM T4,K1	;SAVE KIND
	HRREM T4,PCI1	;AND PIECE NUMBER IF KNOWN
	CAIN T2,"/"	;IS AN EXACT POSITION GIVEN?
	JRST FPOS1	;YES, GO GET IT
CPCK1:	CAIE T2,"X"	;IS IT A CAPTURE
	CAIN T2,"*"
	JRST CAPTR	;YES
YL2:	PUSHJ P,INWD	;GET THE DESTINATION
	PUSH P,T2	;WANT TO GET DIGIT OFF END IF THERE
	SETZB T2,T3	;T3 IS A COUNTER
	LSH T1,-1	;RIGHT JUSTIFY
	MOVEM T1,SVT1
	LSHC T1,-7	;RIGHT ONE CHARACTER
	SKIPN T2	;THERE YET?
	JRST .-3	;NO, TRY AGAIN
	ROT T2,7
	CAIL T2,"1"	;IS IT A DIGIT
	CAILE T2,"8"	;BUT ONLY 1-8
	JRST NODIG
	SUBI T2,"1"
	MOVEM T2,SVN2
	SUBI T2,7
	SKIPE COLOR
	MOVNM T2,SVN2
	SKIPA
NODIG:	MOVE T1,SVT1
	POP P,T2	;RESTORE THE BREAK CHR
	HRLZI T3,-13	;NOW LOOK FOR FILE INFORMATION
	CAMN T1,LCSYM(T3)
	JRST FLCSM2
	AOBJN T3,.-2
	POPJ P,		;ERROR, NOT THERE

FLCSM2:	MOVE T4,LCMN(T3)	;THIS HAS THE TWO POSS. FILES
	HRRZM T4,FD1
	HLRZM T4,FD2
NL2:	CAIE T2,"="
	JRST COMPR	;NO PROMOTION INDICATED
	TRO FL,PROIN	;SET PIT
	PUSHJ P,INWD	;GET NEXT WORD
	HRLZI T3,-4	;CHECK THE KIND OF PIECE
	HRRI T3,1	;ONLY R,N,B, OR Q
	CAMN T1,ASCP2(T3)
	JRST FPRK
	AOBJN T3,.-2
	POPJ P,
FPRK:	HRRZM T3,PROKD
COMPR:	MOVEI I,MVTB+3777	;SET UP TO GEN LEGAL MOVES
	MOVEM I,LLIM
	MOVEM I,ULIM
	PUSHJ P,GENMOV
	MOVE I,ULIM	;ARE THERE ANY
	CAMN I,LLIM	;NO, MUST BE CHECKMATE
	POPJ P,		;JUST AN ERROR IN THIS CASE
	MOVE J,ULIM	;WHERE TO PUT GOOD ONES
	ADDI J,1	;FOR EASE IN MARKING
CLP:	CAMN I,LLIM	;AT END YET?
	JRST ENDINC	;YES, THANK GOD
	MOVE MOVER,(I)	;GET THAT MOVE
	TRNN FL,PROIN	;SHOULD BE PROMOTION?
	JRST NOPRO	;NO
	TRNN MOVER,EPSET	;NO PRO IF EPSET
	TRNN MOVER,PROMBT	;IS IT?
	JRST NTHS	;NO
	LDB T1,[POINT 3,MOVER,22]	;CHECK WHAT PROMOTE TO
	CAME T1,PROKD
	JRST NTHS	;WRONG ONE
NOPRO:	TRNN FL,CAPIN	;MAYBE A CAPTURE
	JRST NOCAPI	;NOT THAT EITHER
	TRNN MOVER,EPSET	;DON'T LOOK IN WRONG CASE
	TRNN MOVER,CAPBT	;IS IT?
	JRST NTHS	;NO,WRONG MOVE
	TRNN MOVER,EPCAP	;IS IT EPCAP
	JRST REGCAP	;NO, REGULAR
	MOVE T1,EPMOVER	;WHO?
	ANDI T1,17	;IGNORE COLOR
	SKIPGE PCI2	;WAS PIECE SPECIFIED
	JRST .+3
	CAME T1,PCI2	;IS IT SAME
	JRST NTHS	;NO
	MOVE T1,KIND(T1)	;WHAT KIND
	CAME T1,K2	;SAME
	JRST NTHS
	SKIPGE FD1	;DESTINATION GIVEN?
	JRST  NODES
	MOVE T1,EPMOVER	;GET SQUARE
	MOVE T2,LOC(T1)
	MOVE T2,FILE(T1)
	CAME T2,FD1
	CAMN T2,FD2	;ONE OF THESE?
	SKIPA	;YES
	JRST NTHS	;NO
	SKIPGE SVN2	;WAS A DIGIT GIVEN?
	JRST NODES	;NO
	MOVE T2,RANK(T1)	;RANK OF THAT SQ
	CAME T2,SVN2	;SAME?
	JRST NTHS	;NO
	JRST NODES	;ON WITH SEARCH
REGCAP:	LDB T1,[POINT 6,MOVER,35]	;WHERE ARE WE GOING
	MOVE T1,OCC(T1)	;WHO IS THERE?
	ANDI T1,17	;IGNORE COLOR
	SKIPGE PCI2	;PIECE SPECIFIED
	JRST .+3
	CAME T1,PCI2
	JRST NTHS
	MOVE T1,KIND(T1)
	CAME T1,K2	;KIND CORRECT?
	JRST NTHS

NOCAPI:	SKIPGE FD1	;WAS A DEST GIVEN?
	JRST NODES
	LDB T2,[POINT 6,MOVER,35]	;WHERE IS HE GOING
	MOVE T1,FILE(T2)	;ITS FILE
	CAME T1,FD1	;SAME AS ONE OR THE OTHER
	CAMN T1,FD2
	SKIPA
	JRST NTHS	;WRONG MOVE
	SKIPGE SVN2	;WAS RANK GIVEN
	JRST NODES	;NO, GO ON
	MOVE T1,RANK(T2)
	CAME T1,SVN2	;SAME?
	JRST NTHS	;NO, ERROR
NODES:	LDB T1,[POINT 4,MOVER,29]	;GET MOVING PIECE
	SKIPGE PCI1	;PIECE SPECIFIED
	JRST .+3
	CAME T1,PCI1	;SAME?
	JRST NTHS
	MOVE T1,KIND(T1)	;CHECK KIND
	CAME T1,K1	;SAME?
	JRST NTHS
	SKIPGE FS1	;SOURCE LOC. GIVEN?
	JRST NOSRC
	LDB T1,[POINT 5,MOVER,29]	;GET MOVER
	MOVE T1,LOC(T1)	;AND LOC
	MOVE T2,FILE(T1)	;OW FILE
	CAME T2,FS1
	CAMN T2,FS2	;SAME AS EITHER?
	SKIPA
	JRST NTHS
	SKIPGE T2,SVN1	;RANK?
	JRST NOSRC
	CAME T2,RANK(T1)
	JRST NTHS
NOSRC:	SUBI J,1	;SAVE IT AWAY
	MOVEM MOVER,(J)	;THERE
NTHS:	SOJA I,CLP	;END OF COMPARE, GO GET NEXT

FPOS1:	PUSHJ P,INWD
	PUSH P,T2	;SAME AS AT YL2
	MOVEI T2,0
	LSH T1,-1
	MOVEM T1,SVT1
	LSHC T1,-7
	SKIPN T2
	JRST .-3
	ROT T2,7
	CAIL T2,"1"
	CAILE T2,"8"
	JRST NODIG2
	SUBI T2,"1"
	MOVEM T2,SVN1
	SUBI T2,7
	SKIPE COLOR
	MOVNM T2,SVN1
	SKIPA
NODIG2:	MOVE T1,SVT1
	POP P,T2
	HRLZI T3,-13
	CAMN T1,LCSYM(T3)
	JRST FLCSYM
	AOBJN T3,.-2
	POPJ P,		;ERROR RETURN
FLCSYM:	MOVE T4,LCMN(T3)
	HRRZM T4,FS1
	HLRZM T4,FS2
	JRST CPCK1
CAPTR:	PUSHJ P,INWD
	TRO FL,CAPIN	;MARK AS CAPTURE
	HRLZI T3,-24	;GET PIECE
	CAMN T1,PCSYM(T3)
	JRST FPCSM2
	AOBJN T3,.-2
	POPJ P,
FPCSM2:	MOVE T4,PCMN(T3)
	HLRZM T4,K2
	HRREM T4,PCI2
	CAIE T2,"/"	;IS A LOC GIVEN
	JRST NL2
	JRST YL2

;HANDLE THE REMAINING MOVES
ENDINC:	CAMLE J,ULIM	;WERE THERE ANY?
	JRST IMPRT	;PRINT IMPOSSIBLE MESSAGE
	CAME J,ULIM	;MAYBE JUST ONE?
	JRST CKAMB	;NO SUCH LUCK, CHECK FURTHER
	MOVE MOVER,@ULIM	;GET THE MOVE
	AOS (P)	;SKIP RETURN
	POPJ P,

;HERE CHECK TO SEE IF ALL BUT ONE OF THE MOVES IS CHECK

CKAMB:	MOVEM J,LLIM	;SAVE THE NEW LOWER LIMIT
	MOVE J,ULIM
	MOVEM J,GER1#	;SAVE IT HERE
	MOVEM J,PUTR1#	;AND HERE
AMBLP:	CAMGE J,LLIM	;MORE TO GO?
	JRST DNAM	;NO CHECK TO SEE IF ONLY ONE LEFT
	MOVE MOVER,@GER1	;GET A MOVE
	JSR GOMOV	;MAKE IT
	PUSHJ P,CKCK	;CHECK ON CHECK
	JRST .+3	;IN CHECK
	MOVEM MOVER,@PUTR1	;SAVE IT
	SOS PUTR1	;AND ADVANCE POINTER
	JSR UNMOV	;RETRACT IT
	SOS J,GER1	;ADVANCE POINTER AND GET IT
	JRST AMBLP
DNAM:	AOS J,PUTR1	;GET POINTER
	CAME J,ULIM
	JRST AMBPR	;STILL TOO MANY
	MOVE MOVER,@ULIM	;GET MOE
	AOS (P)
	POPJ P,
AMBPR:	MOVEI T1,[ASCIZ /AMBIG/]
	CALLI T1,3	;PRINT IT
	POPJ P,	;ERROR RETURN
IMPRT:	MOVEI T1,[ASCIZ /IMP/]
	CALLI T1,3
	POPJ P,
CSTLIN:	CAIE T2,"-"	;DECIDE IF KING OR QUEEN SIDE
	POPJ P,
	PUSHJ P,INWD
	CAME T1,[ASCIZ /O/]
	POPJ P,		;MANY CHANCES FOR ERROR
	CAIN T2,"-"
	JRST QSD	;MUQT BE QUEEN SIDE
	PUSHJ P,KCAS	;IS KING SIDE POSSIBLE
	POPJ P,		;NO
	MOVEI MOVER,KSCBT	;SET THE MOVE
CPOPJ1:	AOS(P)		;OK RETURN
	POPJ P,
QSD:	PUSHJ P,INWD
	CAME T1,[ASCIZ /O/]
	POPJ P,
	PUSHJ P,QCAS	;POSSIBLE?
	POPJ P,
	MOVEI MOVER,QSCBT
	JRST CPOPJ1

;ROUTINE TO DISPLAY NUMBER NUMBER IN T3 POSIT IN T4

DNUM:	MOVEI J,↑D12	;12 DIGITS OF OCTAL
	MOVEI T2,0
	LSHC T2,3
	HLLZ MOVER,NTB(T2)
	IORI MOVER,202
	MOVEM MOVER,(T4)
	HRLZ MOVER,NTB(T2)
	IORI MOVER,2
	MOVEM MOVER,1(T4)
	ADDI T4,2
	SOJG J,DNUM+1
	POPJ P,
;TABLE FOR INPUT ROUTINE

DEFINE ASKR2 (A)
<IRP A <ASCIZ /A/>>

PCSYM:	ASKR2 <P,K,Q,R,N,B,KR,QR,KN,QN,KB,QB,KP,QP>
	ASKR2 <KNP,QNP,KBP,QBP,KRP,QRP>
PCMN:	BYTE (18) 0,-1,5,4,4,3,1,-1,2,-1,3,-1,1,7,1,0,2,6
	BYTE (18) 2,1,3,5,3,2,0,14,0,13,0,16,0,11,0,15
	BYTE (18) 0,12,0,17,0,10

DEFINE ASKR3 (A)
<IRP A <EXP "A">>

LCSYM:	ASKR3 <R,N,B,K,Q,KR,QR,KN,QN,KB,QB>
LCMN:	BYTE (18) 0,7,1,6,2,5,4,4,3,3,7,7,0,0,6,6,1,1,5,5,2,2
ASCP2:	ASKR2 <P,R,N,B,Q>

;TABLES AND BUFFER FOR DISPLAY

DEFINE SDB (X,Y)
<XWD Y*400,X*400+210>
DEFINE DPY (X,Y)
<XWD Y*400,X*400+10>
DEFINE CHR (A,B)
<XWD A,202
XWD B,2>
DEFINE SC (X,A,B)
<IRP X <PC'X: SDB 300,0
	CHR A,B>>

XLIST
NTB:	XWD 405347,316501
	XWD 775721,17777
	XWD 65547,315471
	XWD 565747,315511
	XWD 637275,640557
	XWD 541647,516506
	XWD 415527,315517
	XWD 770357,336574
SDBTBL:	X=1000
	REPEAT 12,<SDB X,200
	X=X+20>
SDBTB2:	X=1000
	REPEAT 12,<SDB X,260
	X=X+20>
PCTB:	X=PC0
	REPEAT 40,<EXP X
	X=X+3>
	0
POSTB:	Y=36*4-3
	REPEAT 10,<X=-4*36+7
	REPEAT 10,<SDB X,Y
	X=X+36>
	Y=Y-36>
OFBTB:	Y=36*4+200
	REPEAT 2,<X=-4*36+7
	REPEAT 10,<SDB X,Y
	X=X+36>
	Y=Y-36>
	Y=-4*36-200
	REPEAT 2,<X=-4*36+7
	REPEAT 10,<SDB X,Y
	X=X+36>
	Y=Y+36>
LIST
;DISPLAY BUFFER
XLIST
DBUF:	Y=36*4
	REPEAT 10,<X=36*4
	REPEAT 31,<DPY X,Y
	X=X-12>
	REPEAT 2,<Y=Y-12
	X=36*4
	REPEAT 11,<DPY X,Y
	X=X-36>>
	Y=Y-12>
	X=36*4
	REPEAT 31,< DPY X,Y
	X=X-12>
	XWD 2,204
PC0:	SDB 300,0
	CHR 360001,40074
PC1:	SDB 300,0
	CHR 714001,1
PC2:	SDB 300,0
	CHR 214021,243
PC3:	SDB 300,0
	CHR 700021,360
PC4:	SDB 300,0
	CHR 714001,163
PC5:	SDB 300,0
	CHR 214021,243
PC6:	SDB 300,0
	CHR 714001,1
PC7:	SDB 300,0
	CHR 360001,40074
	SC (<10,11,12,13,14,15,16,17>,354021,273)
PC20:	SDB 300,0
	CHR 360007,640074
PC21:	SDB 300,0
	CHR 314525,117401
PC22:	SDB 300,0
	CHR 214727,707243
PC23:	SDB 300,0
	CHR 700327,603360
PC24:	SDB 300,0
	CHR 714305,403163
PC25:	SDB 300,0
	CHR 214727,707243
PC26:	SDB 300,0
	CHR 314525,117401
PC27:	SDB 300,0
	CHR 360007,640074
	SC (<30,31,32,33,34,35,36,37>,354023,400273)
	XWD 3,204
	SDB 1000,0
ADP:	REPEAT ↑D24,<0>
	SDB 1000,100
BDP:	REPEAT ↑D24,<0>
	SDB 1000,230
	CHR 405347,316501
	CHR 775721,17777
	CHR 65547,315471
	CHR 565747,315511
	CHR 637275,640557
	CHR 541647,516506
	CHR 415527,315517
	CHR 770357,336574
	CHR 445547,315511
	CHR 745547,325541
LVPLC:	SDB 1000,200
	CHR 1,0
LVPLC2:	SDB 1000,260
	CHR 1,0
LIST

TBLG=.-DBUF
COM:	IOWD TBLG,DBUF
	0
TIMIT:	CONI 730,T3
	LDB T4,[POINT 6,T3,15]
	SUBI T4,4
	IMUL T4,[↑D1000000]
	AND T3,[XWD 3,-1]
	SUBI T3,136700
	ADD T4,T3
	EXCH T4,-1(P)
	LDB T3,[POINT 6,T4,15]
	SUBI T3,4
	IMUL T3,[↑D1000000]
	AND T4,[XWD 3,-1]
	SUBI T4,136700
	ADD T4,T3
	MOVE T3,-1(P)
	SUB T3,T4
	SKIPGE T3
	ADD T3,[↑D60000000]
	MOVEM T3,-1(P)
	POPJ P,
;AC DEFINITIONS
	FL=0
	P=17
	MOVER=16
	DEST=15		;THESE MUST BE THE SAME AS IN PUTCH
	T1=1
	T2=2
	T3=3
	T4=4
	K=6
	I=7
	J=10

;HERE ARE SOME OF THE FLAGS AND SPECIAL BITS USED

KSCBT==20000
QSCBT==40000
CAPBT==4000
EPCAP==10000
EPSET==400000
PROMBT==200000
CAPHP==1
PROMDN==2
PRWP==4
CAPIN==10
PROIN==100
FGMF==200
BSQBT==1
WPMD==2
WP2M==10
TRCMD==100
TRCPV==200
AFGM==2000
TIMR==4000
INCKFF==10000

INBFH:	BLOCK 23	;BUILD IDENTIFIERS

;AND NOW THE GLORIOUS EXTERNALS

EXTERNAL KIND,LM,JMOVE,OCC,RANK,LOC,JBEAR
EXTERNAL PUTCH,STWD,EVALIT,ORDMV,IBUF,FILE,INLP,OBUF,MVTB
EXTERNAL TMPUT,TMGM,TMMP,TMPMP,PTCTR

;AND INTERNALS

INTERNAL COM,INWD,INMOV,GOMOV,CKCK,UNMOV,COLOR,ALPHA,BETA,ENPSQ,EPMOVER
INTERNAL LEVEL,LLIM,MKMOV,NUMIN,PRNTM1,PRNTMV,ULIM,PTBD,BEFFT,WEFFT,OFBTB
INTERNAL CKLEV,PCTB,POSTB,WALLP2,STWDP,TIMIT,LLIM2

END